/*
 * File: look2_iu16u8lu16n16tu1_GA5g36Xa.c
 *
 * Code generated for Simulink model 'SOP'.
 *
 * Model version                  : 1.216
 * Simulink Coder version         : 9.0 (R2018b) 24-May-2018
 * C/C++ source code generated on : Sat Aug 10 20:29:31 2019
 */

#include "rtwtypes.h"
#include "look2_iu16u8lu16n16tu1_GA5g36Xa.h"

uint16_T look2_iu16u8lu16n16tu1_GA5g36Xa(uint16_T u0, uint8_T u1,
		const uint16_T bp0[], const uint8_T bp1[], const uint16_T table[],
		const uint32_T maxIndex[], uint32_T stride) {
	uint16_T y;
	uint16_T frac;
	uint32_T bpIndices[2];
	uint16_T fractions[2];
	uint16_T yR_0d0;
	uint32_T iRght;
	uint32_T bpIdx;
	uint32_T iLeft;

	/* Column-major Lookup 2-D
	 Canonical function name: look2_iu16u8lu16n16tu16_binlcase
	 Search method: 'binary'
	 Use previous index: 'off'
	 Interpolation method: 'Linear point-slope'
	 Extrapolation method: 'Clip'
	 Use last breakpoint for index at or above upper limit: 'on'
	 Remove protection against out-of-range input in generated code: 'off'
	 Rounding mode: 'simplest'
	 */
	/* Prelookup - Index and Fraction
	 Index Search method: 'binary'
	 Extrapolation method: 'Clip'
	 Use previous index: 'off'
	 Use last breakpoint for index at or above upper limit: 'on'
	 Remove protection against out-of-range input in generated code: 'off'
	 Rounding mode: 'simplest'
	 */
	if (u0 <= bp0[0U]) {
		iLeft = 0U;
		frac = 0U;
	} else if (u0 < bp0[maxIndex[0U]]) {
		/* Binary Search */
		bpIdx = maxIndex[0U] >> 1U;
		iLeft = 0U;
		iRght = maxIndex[0U];
		while (iRght - iLeft > 1U) {
			if (u0 < bp0[bpIdx]) {
				iRght = bpIdx;
			} else {
				iLeft = bpIdx;
			}

			bpIdx = (iRght + iLeft) >> 1U;
		}

		frac = (uint16_T) (((uint32_T) (uint16_T) ((uint32_T) u0 - bp0[iLeft])
				<< 16) / (uint16_T) ((uint32_T) bp0[iLeft + 1U] - bp0[iLeft]));
	} else {
		iLeft = maxIndex[0U];
		frac = 0U;
	}

	fractions[0U] = frac;
	bpIndices[0U] = iLeft;

	/* Prelookup - Index and Fraction
	 Index Search method: 'binary'
	 Extrapolation method: 'Clip'
	 Use previous index: 'off'
	 Use last breakpoint for index at or above upper limit: 'on'
	 Remove protection against out-of-range input in generated code: 'off'
	 Rounding mode: 'simplest'
	 */
	if (u1 <= bp1[0U]) {
		iLeft = 0U;
		frac = 0U;
	} else if (u1 < bp1[maxIndex[1U]]) {
		/* Binary Search */
		bpIdx = maxIndex[1U] >> 1U;
		iLeft = 0U;
		iRght = maxIndex[1U];
		while (iRght - iLeft > 1U) {
			if (u1 < bp1[bpIdx]) {
				iRght = bpIdx;
			} else {
				iLeft = bpIdx;
			}

			bpIdx = (iRght + iLeft) >> 1U;
		}

		frac = (uint16_T) (((uint32_T) (uint8_T) ((uint32_T) u1 - bp1[iLeft])
				<< 16) / (uint8_T) ((uint32_T) bp1[iLeft + 1U] - bp1[iLeft]));
	} else {
		iLeft = maxIndex[1U];
		frac = 0U;
	}

	/* Column-major Interpolation 2-D
	 Interpolation method: 'Linear point-slope'
	 Use last breakpoint for index at or above upper limit: 'on'
	 Rounding mode: 'simplest'
	 Overflow mode: 'wrapping'
	 */
	bpIdx = iLeft * stride + bpIndices[0U];
	if (bpIndices[0U] == maxIndex[0U]) {
		y = table[bpIdx];
	} else {
		yR_0d0 = table[bpIdx + 1U];
		if (yR_0d0 >= table[bpIdx]) {
			y =
					(uint16_T) ((uint32_T) (uint16_T) (((uint32_T) (uint16_T) ((uint32_T) yR_0d0
							- table[bpIdx]) * fractions[0U]) >> 16)
							+ table[bpIdx]);
		} else {
			y =
					(uint16_T) ((uint32_T) table[bpIdx]
							- (uint16_T) (((uint32_T) (uint16_T) ((uint32_T) table[bpIdx]
									- yR_0d0) * fractions[0U]) >> 16));
		}
	}

	if (iLeft == maxIndex[1U]) {
	} else {
		bpIdx += stride;
		if (bpIndices[0U] == maxIndex[0U]) {
			yR_0d0 = table[bpIdx];
		} else {
			yR_0d0 = table[bpIdx + 1U];
			if (yR_0d0 >= table[bpIdx]) {
				yR_0d0 =
						(uint16_T) ((uint32_T) (uint16_T) (((uint32_T) (uint16_T) ((uint32_T) yR_0d0
								- table[bpIdx]) * fractions[0U]) >> 16)
								+ table[bpIdx]);
			} else {
				yR_0d0 =
						(uint16_T) ((uint32_T) table[bpIdx]
								- (uint16_T) (((uint32_T) (uint16_T) ((uint32_T) table[bpIdx]
										- yR_0d0) * fractions[0U]) >> 16));
			}
		}

		if (yR_0d0 >= y) {
			y =
					(uint16_T) ((uint32_T) (uint16_T) (((uint32_T) (uint16_T) ((uint32_T) yR_0d0
							- y) * frac) >> 16) + y);
		} else {
			y = (uint16_T) ((uint32_T) y
					- (uint16_T) (((uint32_T) (uint16_T) ((uint32_T) y - yR_0d0)
							* frac) >> 16));
		}
	}

	return y;
}

/*
 * File trailer for generated code.
 *
 * [EOF]
 */
